package co.kr.bettersoft.carrotmerchantmobile.activity;
/**
 * Login
 * 로그인 페이지
 */
import org.json.JSONException;
import org.json.JSONObject;

import co.kr.bettersoft.carrotmerchantmobile.common.CarrotMerchantMobileRest;
import co.kr.bettersoft.carrotmerchantmobile.common.CommonConstant;
import co.kr.bettersoft.carrotmerchantmobile.domain.CheckMileageMerchant;


import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class Login extends Activity{
	String TAG = "Login";

	final int LOGIN = 101;
	final int SELECT_MERCHANT_INFORMATION = 102;
	
	MainTabs mainTabs = (MainTabs)MainTabs.mainTabs;

	// 로그인용 아이디, 비번 값
	String merchantId = "";
	String password = "";
	
//	// 서버 통신 용
	CarrotMerchantMobileRest carrotMerchantMobileRest;
	String callResult = "";
	String tempstr = "";
	JSONObject jsonObject;
	
	Boolean loading = false;
	
	// 레이아웃의 개체들 - 로그인버튼, 아이디/비번입력창
	Button loginBtn;
	TextView idText,pwText;
	// 진행바
	ProgressBar pb1;		// 중단 로딩 진행바
	// 키보드 자동 숨기기 위한 부모 레이아웃(리스너 달아서 키보드 숨김)과 입력 매니저
	View parentLayout;
	InputMethodManager imm;

	CheckMileageMerchant checkMileageMerchant;		// 가맹점 정보 받을 도메인 객체
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		
				if(b.getInt("showToast")==1){		// 화면에 토스트 띄우기. 띄우는 문구는 msg 로 받은 값
					Toast.makeText(Login.this, b.getString("msg"), Toast.LENGTH_SHORT).show();
					//					customToastShow(2,b.getString("msg"));
				}
				if(b.getInt("showAlert")==1){					 // 경고창 . 
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							// *** "Carrot" 하드코딩 --> 변수사용 
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							//
						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("initLogin")==1){		// 화면 로그인 정보 초기화 하기
					idText.setText("");
					pwText.setText("");
				}
				if(b.getInt("loginEnable")==1){		// 화면 로그인 버튼 사용 가능
					loginBtn.setEnabled(true);
				}else if(b.getInt("loginEnable")==2){		// 화면 로그인 버튼 사용 불가
					loginBtn.setEnabled(false);
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.login_page_progressbar1);
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.login_page_progressbar1);
					}
					pb1.setVisibility(View.INVISIBLE);
				}
				
				switch (msg.what)
				{
					case LOGIN   : runOnUiThread(new RunnableLogin());		
						break;
					case SELECT_MERCHANT_INFORMATION   : runOnUiThread(new RunnableSelectMerchantInformation());		
						break;	
					default : 
						break;
				}	
				
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.w(TAG,"LoginPage onCreate");
		requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
		setContentView(R.layout.login_page);
		
		carrotMerchantMobileRest = new CarrotMerchantMobileRest(); // oncreate
		
		parentLayout = findViewById(R.id.login_page_parent_layout);			// 부모 레이아웃. 리스너 달아서 키보드 숨김에 사용

		// 레이아웃의 개체들을 가져와서 사용
		loginBtn = (Button) findViewById(R.id.login_btn);
		idText = (TextView) findViewById(R.id.login_id_text);
		pwText = (TextView) findViewById(R.id.login_pw_text);

		// 부모 레이아웃 리스너 - 외부 터치 시 키보드 숨김 용도
		parentLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.w(TAG,"parentLayout click");
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				imm .hideSoftInputFromWindow(idText.getWindowToken(), 0);
			}
		});
		// 버튼  리스너.
		loginBtn.setOnClickListener(new OnClickListener() {			// 로그인 버튼
			@Override
			public void onClick(View v) {
				Log.w(TAG,"loginBtn click");
				loginDisable();
//				new backgroundLogin().execute();		// 비동기 실행
				handler.sendEmptyMessage(LOGIN);
			}
		});
	}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * 러너블.서버와 통신하여인증 1단계 수행.
	 */
	class RunnableLogin implements Runnable {
		public void run(){
			new backgroundLogin().execute();
		}
	}
	/**
	 * backgroundLogin
	 * 비동기로 로그인한다
	 *
	 * @param 
	 * @return 
	 */
	public class backgroundLogin extends  AsyncTask<Void, Void, Void> { 
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundLogin");
			merchantId = idText.getText()+"";
			password = pwText.getText()+"";
			if(merchantId.length()<1){
				// 아이디 미입력
				showMsg(returnThis().getResources().getString(R.string.input_your_id));			// showMsg("아이디를 입력해 주십시오.");
				loading = false;
			}else if(password.length()<1){
				// 비번 미입력
				showMsg(returnThis().getResources().getString(R.string.input_your_pw));					// showMsg("비밀번호를 입력해 주십시오.");	
				loading = false;
			}else{
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);		// 키보드 숨김
				imm .hideSoftInputFromWindow(idText.getWindowToken(), 0);
				
				// 파리미터 세팅
				CheckMileageMerchant checkMileageMerchantParam = new CheckMileageMerchant();
				checkMileageMerchantParam.setMerchantId(merchantId);
				checkMileageMerchantParam.setPassword(password);
				// 호출
					showPb();
				callResult = carrotMerchantMobileRest.RestLogin(checkMileageMerchantParam);
				hidePb();
				// 결과 처리
				if(callResult.equals("S")){
					processLoginResult();
	    		}else{	
					showMsg(returnThis().getResources().getString(R.string.request_failed));
					loading = false;
	    		}
			}
			return null; 
		}
	}
	
	/**
	 * 러너블.가맹점 정보 가져온다
	 */
	class RunnableSelectMerchantInformation implements Runnable {
		public void run(){
			new backgroundSelectMerchantInformation().execute();
		}
	}
	/**
	 * backgroundSelectMerchantInformation
	 * 비동기로 가맹점 정보 가져온다
	 *
	 * @param 
	 * @return 
	 */
	public class backgroundSelectMerchantInformation extends  AsyncTask<Void, Void, Void> { 
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundSelectMerchantInformation");
			
			// 파리미터 세팅
			CheckMileageMerchant checkMileageMerchantParam = new CheckMileageMerchant();
			checkMileageMerchantParam.setMerchantId(merchantId);
			// 호출
				showPb();
			callResult = carrotMerchantMobileRest.RestSelectMerchantInformation(checkMileageMerchantParam);
			hidePb();
			// 결과 처리
			if(callResult.equals("S")){
				processSelectMerchantInformationData();
    		}else{	
    			hidePb();
    			showMsg(returnThis().getResources().getString(R.string.request_failed));		// 요청이 실패하였습니다.\n잠시후 다시 시도해 주십시오.
    			loading = false;
    		}
			return null; 
		}
	}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	// 로그인 결과 정보를 받아서 처리한다.
	public void processLoginResult(){
		try {			// 파싱 
			tempstr = carrotMerchantMobileRest.getTempstr();
			jsonObject = new JSONObject(tempstr);					
			JSONObject jsonobj2 = jsonObject.getJSONObject("checkMileageMerchant");
			String totalCount = "";
			try{
				totalCount = jsonobj2.getString("totalCount");
			}catch(Exception e){
				totalCount = "0";
			}		
			if(totalCount.equals("1")){
				// 로그인 성공
				if(CommonConstant.comeBack){				// 1. 홈으로 나갔다온경우. 
					Log.d(TAG,"CommonUtils.comeBack T");
					if((CommonConstant.tempMyID).equals(merchantId)){					// 동일 아디일 경우 혼자 종료
						Log.d(TAG,"tempMyID  equals merchantId");
						CommonConstant.comeBack = false;
						finish();
					}else{
						Log.d(TAG,"tempMyID not equals merchantId");
//						new backgroundSelectMerchantInformation().execute();		// 가맹점 정보를 가져온다.
						handler.sendEmptyMessage(SELECT_MERCHANT_INFORMATION);
					}
				}else{									// 2. 일반 로그인인 경우
					// 로그인 성공  -> 가맹점 정보 가져오기
//					new backgroundSelectMerchantInformation().execute();
					handler.sendEmptyMessage(SELECT_MERCHANT_INFORMATION);
				}
			}else{	
				// 로그인 실패
				showResultDialog(returnThis().getResources().getString(R.string.login_failed));			// 로그인에 실패하였습니다.\n아이디,비밀번호를 다시 확인해주시기 바랍니다.	
				loading = false;
				loginEnable();
			}
			// 화면의 아이디, 비번 입력창 초기화.....
			initLogin();
		} catch (JSONException e) {
			hidePb();
			showMsg(returnThis().getResources().getString(R.string.request_failed));		// 요청이 실패하였습니다.\n잠시후 다시 시도해 주십시오.
			loading = false;
			loginEnable();
		} 
	}
	
	// 가맹점 정보를 받아서 처리한다.
	public void processSelectMerchantInformationData(){
		try {
			// 데이터 세팅부..
			tempstr = carrotMerchantMobileRest.getTempstr();
			jsonObject = new JSONObject(tempstr);
			JSONObject jsonobj2 = jsonObject.getJSONObject("checkMileageMerchant");
			if(CommonConstant.comeBack){			// 홈갔다와서 다른 아디로 로그인시  탭 예하 액티비티들에게 값을 덮어써준다..
				MainTabs.merchantId = merchantId;
				MainTabs.countryCode = jsonobj2.getString("countryCode");
				MainTabs.languageCode = jsonobj2.getString("languageCode");
				
				// 이미 실행되어 있는 액티비티 이므로 추가 액티비티 실행은 없음. 대신 첫 탭으로 바꿔줌.
				MainTabs.initTab();
				CommonConstant.comeBack = false;
				finish();
			}else{								// 일반 적인 로그인
				Intent nextIntent = new Intent(Login.this, MainTabs.class);		// 메인으로 이동 (데이터 전달)
				nextIntent.putExtra("merchantId", merchantId);
				nextIntent.putExtra("countryCode", jsonobj2.getString("countryCode"));
				nextIntent.putExtra("languageCode", jsonobj2.getString("languageCode"));	// 서버 값 사용
				nextIntent.putExtra("autoLogin", false);
				startActivity(nextIntent);
			}
			hidePb();
			loading = false;
			finish();
		} catch (JSONException e) {
			hidePb();
			e.printStackTrace();
			loading = false;
		} 
	}
		
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	/**
	 * returnThis
	 *  컨택스트 반환한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public Context returnThis(){
		return this;
	}
	
	/*
	 * 핸들러 파트.
	 *  화면상의 변화가 있는 요청은 핸들러를 사용
	 */
	// 화면에 토스트 띄움 msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
	/**
	 * showMsg
	 *  화면에 토스트 띄움 msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
	 *
	 * @param msg
	 * @param
	 * @return
	 */

	public void showMsg(final String msg){			
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showToast", 1);
						b.putString("msg", msg);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 
	//토스트를 얼럿으로 바꾼다.
	/**
	 * showResultDialog
	 *  토스트를 얼럿으로 바꾼다.(얼럿 띄운다)
	 *
	 * @param msg
	 * @param
	 * @return
	 */

	public void showResultDialog(final String msg){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showAlert", 1);
						b.putString("msg", msg);			// 화면에 보여줄 메시지
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	// 아이디, 비번 초기화.  로그인 성공 또는 실패 이후 화면에 있던 로그인 정보를 초기화 한다.
	/**
	 * initLogin
	 * 아이디, 비번 초기화.  로그인 성공 또는 실패 이후 화면에 있던 로그인 정보를 초기화 한다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void initLogin(){			
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("initLogin", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 
	// 로그인 버튼 사용 가능 
	/**
	 * loginEnable
	 * 로그인 버튼 사용 가능 하게 한다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void loginEnable(){			
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("loginEnable", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 
	// 로그인 버튼 사용 불가. (두번 눌리는것 방지)
	/**
	 * loginDisable
	 * 로그인 버튼 사용 불가로 만든다 (두번 눌리는것 방지)
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void loginDisable(){			
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("loginEnable", 2);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 

	//커스터마이징된 토스트를 띄우는 부분
	/**
	 * customToastShow
	 * 커스터마이징된 토스트를 띄운다
	 *
	 * @param img
	 * @param text
	 * @return
	 */
	private void customToastShow(int img, CharSequence text) {
		//1
		LayoutInflater inflater = getLayoutInflater();
		View layout = inflater.inflate(R.layout.custom_toast_layout,
				(ViewGroup) findViewById(R.id.custom_toast_layout_root));
		TextView text2 = (TextView) layout.findViewById(R.id.custom_toast_text);
		text2.setText(text);
		text2.setTextSize(12);
		Toast toast = new Toast(getApplicationContext());
		toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
		toast.setDuration(Toast.LENGTH_SHORT);
		toast.setView(layout);toast.show();
	}
	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}

	/**
	 * onBackPressed
	 *  종료시 모두 종료시킨다. (홈갔다왔을때 용도)
	 *
	 * @param
	 * @param
	 * @return
	 */
	@Override
	public void onBackPressed() {
		if(CommonConstant.comeBack){
			CommonConstant.comeBack = false;
			mainTabs.finish();			// 종료시켜봐.
			finish();
		}
		super.onBackPressed();
	}

}
